//
//  weiboMainController.swift
//  czWB
//
//  Created by Qing on 2018/5/25.
//  Copyright © 2018年 成哥哥. All rights reserved.
//

import UIKit
import SVProgressHUD

class WBMainController: UITabBarController {
    
    /// 定时器
    private var timer: Timer?
    
    let status = WBHomeController()

    override func viewDidLoad() {
        super.viewDidLoad()

        setupChildController()
        setupComposeButton()
        setupTimer()
        setupNewTeature()
        
        //navigation代理，实现首页点击数字跳回首页的方法
        delegate = self
        
//        注册用户登录通知
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(userLogon),
                                               name: NSNotification.Name(rawValue: WBUserShouldLoginNotification),
                                               object: nil)
        
//        注册用户登录成功通知
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(userLoginSuceess),
                                               name: NSNotification.Name(rawValue: WBUserloginSuccessNotifacaton),
                                               object: nil)
    }
    
//   销毁时间器
    deinit {
        
//        销毁时间
        timer?.invalidate()
        
//        销毁通知
        NotificationCenter.default.removeObserver(WBUserShouldLoginNotification)
        
        NotificationCenter.default.removeObserver(WBUserloginSuccessNotifacaton)
    }

    
    /// 屏幕方向
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        get{
            return .portrait
        }
    }
    
//        用户登录成功方法
    @objc private func userLoginSuceess(n: Notification)  {
        
        print("登录成功的通知是\(n)")
        
//        当view == nil时， 视图的生命周期会重新加载。 loadView() --> viewDidLoad()
        view = nil
        
        
        
    }

    //MARK: - 监听用户登录动作
    @objc private func userLogon(n: Notification)  {
        
//        print("通知是：\(n)")
//        token3种状态
//        1.未登录，无值
//        2.已登录，有值
//        3.已登录，有值，过期。这个在发起通知时object加上了标识""bad token""
        
        /// 在使用中Token过期，SVP提示框保留时间。
        var time = DispatchTime.now()
        
//      n.object(""bad token"")是token过期发起时的通知，
//      过期请重新登录样式提示跟其他不一样。并且停留在屏幕的显示时间要稍微长一些
        if n.object != nil {
            
            SVProgressHUD.setDefaultStyle(SVProgressHUDStyle.dark)
            
            SVProgressHUD.showInfo(withStatus: "登录过期，请重新登录")
            
            time = DispatchTime.now() + 2
        }
        
        DispatchQueue.main.asyncAfter(deadline: time) {
            
            SVProgressHUD.setDefaultStyle(SVProgressHUDStyle.custom)
            
            let nvc = UINavigationController(rootViewController: WBOAuchViewController())
            
            self.present(nvc, animated: true, completion: nil)
            
        }

    }
    
    //MARK: 撰写按钮动作
    //FIXME: 还没有实现
   @objc func ComposeAction()  {
    
////    利用导航条测试屏幕方向
//    let vc = UIViewController()
//
//    vc.view.backgroundColor = UIColor.black
//
//    let nav = UINavigationController(rootViewController: vc)
//
//    present(nav, animated: true, completion: nil)
    
        print("撰写")
    }
    
    /// 撰写按钮的图片和背景图
    lazy var setComposeButton: UIButton = UIButton.cz_buttonImage("tabbar_compose", backImageName: "tabbar_compose_highlight")
    
}


// MARK: - 新特性页面相关, 判断版本号切的相关页面。
extension WBMainController {
    
    
    /// 判断是否有新版本，有新版本则显示新特性，否则显示欢迎界面。
    private func setupNewTeature()  {

        let filePath = NSHomeDirectory() + "/Documents/version.plist"
        
//        1.取到上次保存在沙盒的版本号
        guard let versionData = NSData(contentsOfFile: filePath),
            let berforVsrsion = String(data: versionData as Data, encoding: String.Encoding.utf8) else {
                print("取上一次保存到磁盘的版本号失败")
                return
        }
        
//        2.现取在的版本号
        let currentVersion: String = Bundle.main.infoDictionary!["CFBundleShortVersionString"]  as? String ?? ""

//        3.判断是否有新版本号并切换不同的视图
        let v = berforVsrsion != currentVersion ? WBNewfeatrue.newFaeatrue() : WBWelcome.welComeview()
        
        
//        v.frame = view.bounds
        view.addSubview(v)
        

//        4.把现版本号保存到沙盒，以便下次重启时使用
        guard let saveSersion = currentVersion.data(using: String.Encoding.utf8) else {
            print("保存现版本号 string 转 data 失败")
            return
        }
        (saveSersion as NSData).write(toFile: filePath, atomically: true)

    }
    
}


// MARK: - 双击首页滚动到最顶端
extension WBMainController: UITabBarControllerDelegate {
    
    /// 将要选择 TabbarItem 时
    ///
    /// - Parameters:
    ///   - tabBarController: tabBarController
    ///   - viewController: 目标控制器
    /// - Returns: 是否切的到目标控制器
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        
//        print("切的到\(viewController)")
        
        /// 1.获得控制器在数组中的索引
        let idx = children.firstIndex(of: viewController)
        
//        2.判断当前索引是否首页，并且idx也是首页。重复点击首页跳转到顶部
        if selectedIndex == 0 && idx == 0 {
            
//            3. 让表格滚动到顶部
//                >获取到底部的控制器
            let nvc = children[0] as? UINavigationController
            let vc = nvc?.children[0] as? WBHomeController
            
            vc?.tableView?.setContentOffset(CGPoint(x: 0, y: 0 - 64), animated: true)
            
            //移除微博未读数量数字显示
            vc?.tabBarItem.badgeValue = nil
            UIApplication.shared.applicationIconBadgeNumber = 0
            
        }
        
//        判断控制器是否是 UIViewcontroller
        return !viewController.isMember(of: UIViewController.self)
        
    }
    
}


// MARK: - 定时器相关，监测新微博未读数量
extension WBMainController {
    
    
    /// 定时器，用于监测新微博数量
    private func setupTimer() {
        
        if !WBNetworkManager.shared.userLogon {
            
            return
        }
        
        timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(updetaTimer), userInfo: nil, repeats: true)
    
    }
    
    
    /// 监测动作，当有新微博时，点击首页跳转到顶部并刷新视图
    @objc func updetaTimer()  {
        
//        微博提醒关闭了接口，故自己随机生成数量数组代替
        var Newarray = [Int]()
        
        for i in 0..<Int(arc4random() % 10 + 1) {
            
            Newarray.append(i)
    
        }
        
//        把未读的微博数量在首页按钮右上角显示出来
        self.tabBar.items?[0].badgeValue = "\(Newarray.count)"
//        把未读的微博数量在App图标右上角显示出来
        UIApplication.shared.applicationIconBadgeNumber = Newarray.count
        
//        print("新微博数据是")
//        print(Newarray)
        
    }
    
}

// MARK: - 设置底部导航栏，用反身设置子控制器
extension WBMainController {
    
    /// 设置撰写按钮的位置
    private func setupComposeButton()  {
        
//        1.在视图上添加按钮
        tabBar.addSubview(setComposeButton)
//        2.计算每个tarBar的宽度
        let count = CGFloat(children.count)
        let w = tabBar.bounds.width / count

        setComposeButton.frame = tabBar.bounds.insetBy(dx: w * 2, dy: -10)
        
//        4.监听撰写
        setComposeButton.addTarget(self, action: #selector(WBMainController.ComposeAction), for: UIControl.Event.touchUpInside)
        
    }
    
    
    /// 设置所有子控制器
    private func setupChildController()  {
        
        //1.取得从网络下载的Json的路径
        //2.取demo.json文件的内容
        //3.把文件转成二进制
//        4.如果转换不成功则为nil，就使用本地的json更新
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (docDir as NSString).appendingPathComponent("demo.json")
        var data = NSData(contentsOfFile: jsonPath)

        if data == nil {
            let path = Bundle.main.path(forResource: "demo.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
            
        }
//        5.如果转换成功，则序列化文件转换成数组，使用新的数组更新UI。
        guard let array = try! JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String : Any]] else {
                return
        }
        
//        1.设置数数组字典信息: -- 首页的visitorInfo--imageName不需要传值，因为在实例化uiimageView的时候已经设置过了。若传值会导致if失效，其他的视图也会有这个imgae
//        let array = [
//            ["clsName": "WBHomeController", "title": "首页", "imageName":"tabbar_home",
//             "visitorInfo": ["imageName": "", "message": "首页首页首页首页首页首页首页首页首页首页"]
//             ],
//
//            ["clsName": "WBMesessgeController", "title": "消息", "imageName":"tabbar_home",
//             "visitorInfo": ["imageName": "visitor_message", "message": "消息消息消息消息消息消息消息消息消息消息消息"]
//             ],
//
//            ["clsName": ""],
//
//            ["clsName": "WBDiscoreyController", "title": "发现", "imageName":"tabbar_home",
//             "visitorInfo": ["imageName": "visitor_discover", "message": "发现发现发现发现发现发现发现发现发现发现发现发现"]
//             ],
//            ["clsName": "WBProfileViewController", "title": "我", "imageName":"tabbar_home",
//             "visitorInfo": ["imageName": "visitor_profile", "message": "我我我我我我我我我我我我我我我我我我我我我我"]
//             ]
//            ]
        
//        let data = try? JSONSerialization.data(withJSONObject: array, options: [.prettyPrinted])
//        (data as? NSData)?.write(toFile: "/Users/qing/Desktop/demo.json", atomically: true)
        
        
        
//        测试数据格式是否正确，转换成pilist查看更直观
//        (array as NSArray).write(toFile: "/Users/qing/Desktop/info.plist", atomically: true)
        
//        2.初始化控制器数组
        var arrayM = [UIViewController]()
        
//        3.每循环1次，就使用controller方法创建1个控制器。
        for dict in array {
            
            
            arrayM.append(controller(dict: dict))
            
            
            viewControllers = arrayM
            
        }
        
    }
    
    /// 使用字典信息创建控制器
    ///
    /// - Parameter dict: 字典信息
    /// - Returns: 控制器
    private func controller(dict: [String: Any]) -> UIViewController  {
        
//        1.获取字典信息并用"NSClassFromString"生成控制器类型
        guard let clsName = dict["clsName"] as? String,
            let title = dict["title"] as? String,
            let imageName = dict["imageName"] as? String,
            let cls = NSClassFromString(Bundle.main.nameSpace + "." + clsName) as? WBBaseController.Type,
        let visitorInfo = dict["visitorInfo"]
        else {
            
            return UIViewController()
        }
        
//        2.初始化视图控制器
        let vc = cls.init()
        
//        访客视图传值
        vc.visitorInfoDictionary = visitorInfo as? [String : String]
        
//        3.设置抬头文字
        vc.title = title
        
//        4.设置图片
        vc.tabBarItem.image = UIImage(named: imageName)
//        5.设置图片渲染颜色
        vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlight")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
        
//        6.设置tabBar字体颜色 以及 字体大小。 系统默认是12
        vc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : UIColor.orange], for: UIControl.State.selected)
        vc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.font : UIFont.systemFont(ofSize: 12)], for: UIControl.State.normal)
//        添加根视图控制器，在添加时会调用push方法 把控制器压栈
        let nvc = WBNavigationController(rootViewController: vc)
        
        return nvc
    }

    
}
